/* 
  第16节：promise对象的使用
    ES6中的promise的出现给我们很好的解决了回调地狱的问题，在使用ES5的时候，在多层嵌套回调时，写完的代码层次过多，很难进行维护和二次开发，ES6认识到了这点问题，现在promise的使用，完美解决了这个问题。那我们如何理解promise这个单词在ES5中的作用那，你可以想象他是一种承诺，当它成功时执行一些代码，当它失败时执行一些代码。它更符合人类的行为思考习惯，而不在是晦涩难懂的冰冷语言。

  promise执行多步操作非常好用，那我们就来模仿一个多步操作的过程，那就以吃饭为例吧。要想在家吃顿饭，是要经过三个步骤的。

  洗菜做饭。
  坐下来吃饭。
  收拾桌子洗碗。
  这个过程是有一定的顺序的，你必须保证上一步完成，才能顺利进行下一步。我们可以在脑海里先想想这样一个简单的过程在ES5写起来就要有多层的嵌套。那我们现在用promise来实现。  

*/

let state=1;  //状态

function step1(resolve,reject){
   console.log('1.开始-洗菜做饭');
   if(state==1){
       resolve('洗菜做饭--完成');
   }else{
       reject('洗菜做饭--出错');
   }
}


function step2(resolve,reject){
   console.log('2.开始-坐下来吃饭');
   if(state==1){
       resolve('坐下来吃饭--完成');
   }else{
       reject('坐下来吃饭--出错');
   }
}


function step3(resolve,reject){
   console.log('3.开始-收拾桌子洗完');
    if(state==1){
       resolve('收拾桌子洗完--完成');
   }else{
       reject('收拾桌子洗完--出错');
   }
}

new Promise(step1).then(function(val,...args){
  //  console.log(args.length)  //0
   console.log(val);  // val  就是拿到 resolve(成功后的返回)  reject(失败) 的值
   state=2;
   return new Promise(step2);  //第一步成功,开始执行第二步
}).then(function(val){
    console.log(val);
   return new Promise(step3);
}).then(function(val){
   console.log(val);
   return val;
}).catch((val)=>{  //可以捕获到前面的所有错误
  console.log(val);
}).done(  //// 接收错误，并向全局抛出

).finally()  // 不管then() 是否有错，finally都会执行  它与done方法的最大区别，它接受一个普通的回调函数作为参数，该函数不管怎样都必须执行。
;